package book.nettyinaction.ch04;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;

/**
 * 代码清单 4-1 未使用 Netty 的阻塞网络编程
 *
 * 这段代码完全可以处理中等数量的并发客户端。
 * 但是随着应用程序变得流行起来，你会发现它并不能很好地伸缩到支撑成千上万的并发连入连接。
 */
public class PlainOioServer {

    public void serve( int port ) throws IOException {
        // 将服务器绑定到指定端口
        final ServerSocket socket = new ServerSocket( port );

        try {
            for (;;) {
                // 接受连接
                final Socket clientSocket = socket.accept();

                System.out.println("Accepted connection from " + clientSocket);

                // 创建一个新的线程来处理该连接
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        OutputStream out;
                        try {
                            out = clientSocket.getOutputStream();
                            // 将消息写给已连接的客户端
                            out.write( "Hi!\r\n".getBytes(Charset.forName("UTF-8")) );
                            out.flush();

                            // 关闭连接
                            clientSocket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                clientSocket.close();
                            } catch (IOException e) {
                                // ignore ont close
                            }
                        }
                    }
                }).start();  // 启动线程
            }
        } catch ( IOException e) {
            e.printStackTrace();
        }
    }
}
